#ifndef GY_GRAPHICSARCITEM_H
#define GY_GRAPHICSARCITEM_H

#include "Graphics/BasicGraphics/GY_BasicsGraphicsObject.h"
#include "GY_ControlLibrary_global.h"
#include <QVariant>
/**
 * @brief The GY_GraphicsArcItem class 扇形图元基类
 */
class GY_CONTROLLIBRARY_EXPORT GY_GraphicsArcItem : public GY_BasicsGraphicsObject
{
    Q_OBJECT
public:
    explicit Q_INVOKABLE GY_GraphicsArcItem(const QString &guid,QGraphicsItem *parent = nullptr);
    explicit Q_INVOKABLE GY_GraphicsArcItem(const QString &guid,const QPointF &position,const qreal &startAngele,
                                            const qreal &sweptAngele,const qreal &Raduis,QGraphicsItem *parent = nullptr);

private:
    /**
     * @brief initializationPropertyInfo 初始化属性信息
     */
    void initializationPropertyInfo();
    /**
     * @brief UpdateDraw 更新绘制
     */
    void updateDraw();
    /**
     * @brief updateCirlePoint  更新中心点
     * @param name 属性名称
     * @param value 中心点位置
     * @return 是否更新成功
     */
    bool updateCirlePoint(const QString &name, const QVariant &value);
    /**
     * @brief updateStartAngele 更新开始角度
     * @param name 属性名称
     * @param value 开始角度
     * @return 是否更新成功
     */
    bool updateStartAngle(const QString &name, const QVariant &value);
    /**
     * @brief updateSweptAngele 更新经过角度
     * @param name 属性名称
     * @param value 经过角度
     * @return 是否更新成功
     */
    bool updateSweptAngele(const QString &name, const QVariant &value);
    /**
     * @brief updateRadius 更新半径
     * @param name 属性名称
     * @param value 半径
     * @return 是否更新成功
     */
    bool updateRadius(const QString &name, const QVariant &value);
    /**
     * @brief precalculatedPosition 计算点位置
     * @param centerPoint  中心点位置
     * @param radius 半径
     * @param angele 角度
     * @return 计算得到的点位置
     */
    QPointF precalculatedPosition(const QPointF &centerPoint, const double radius, const double angele);
    /**
     * @brief precalculatedAngle 计算相对中心点的角度
     * @param centerPoint 中心点
     * @param calculatePoint 计算点
     * @return 角度
     */
    qreal precalculatedAngle(const QPointF &centerPoint, const QPointF &calculatePoint);
    /**
     * @brief updateInnerRadiusPoint 更新半径点2
     * @param name 属性名称
     * @param value 半径点2位置
     * @return 是否更新成功
     */
    bool updateRadiusPoint2(const QString &name, const QVariant &value);
    /**
     * @brief updateOuterRadiusPoint 更新半径点1
     * @param name 属性名称
     * @param value 半径点1位置
     * @return 是否更新成功
     */
    bool updateRadiusPoint1(const QString &name, const QVariant &value);
    /**
     * @brief updateIncludeCenter 更新是否过圆心
     * @param name 属性名称
     * @param value 是否过圆心bool
     * @return 是否更新成功
     */
    bool updateIncludeCenter(const QString &name, const QVariant &value);
    /**
     * @brief calculateRadiusPoint2Position
     * 计算半径点2位置
     */
    void calculateRadiusPoint2Position();
    /**
     * @brief calculateRadiusPoint1Position
     * 计算半径点1位置
     */
    void calculateRadiusPoint1Position();
};

#endif // GY_GRAPHICSARCITEM_H
